/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * EventosPresentacion.java
 *
 * Created on 14-mar-2011, 13:47:27
 */

package presentacion.eventos;

import hibernate.objeto.AplicacionVacuna;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import hibernate.objeto.Evolucion;
import hibernate.objeto.EvolucionEnfermeriaDeInternacion;
import hibernate.objeto.ExamenComplementario;
import hibernate.objeto.Farmacologico;
import hibernate.objeto.Interconsulta;
import hibernate.objeto.NoFarmacologico;
import hibernate.objeto.TratamientoYPractica;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Date;
import java.util.Vector;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
import logica.AplicacionVacunaLogica;
import logica.CapaLogica;
import logica.DiagnosticoYTriageInternacionLogica;
import logica.EnfermedadYDiagnosticoAmbulatorioLogica;
import logica.EvolucionEnfermeriaDeInternacionLogica;
import logica.EvolucionLogica;
import logica.ExamenComplementarioLogica;
import logica.FarmacologicoLogica;
import logica.InterconsultaLogica;
import logica.NoFarmacologicoLogica;
import logica.TratamientoYPracticaLogica;
import presentacion.CapaPresentacion;
import presentacion.GestionPacientePresentacion;
import presentacion.acceso.RestriccionAcceso;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;

/**
 *
 * @author Administrador
 */
public class EventosPresentacion extends javax.swing.JDialog {

    /** Creates new form EventosPresentacion */
    public EventosPresentacion(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();

        vectorObjetosArbol = null;
        vectorAniosArbol = new Vector<Integer>();
        customizado = false;

        personalizarGUI();

        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        this.setLocationRelativeTo(null);
        setearEventosQueCapturanTeclaEnterYEscape();
    }

    /**
     * Setea datos de la ventana.
     * 
     */
    private void personalizarGUI() {
        this.setJMenuBar(BarMenu.createMenuBarEventos(this));

        //Construye el arbol
        construirArbol();
    }

    /**
     * Carga los combobox con todos los años que forman parte del arbol.
     *
     */
    private void cargarComboBoxPeriodos() {
        String[] listaAnios = new String[vectorAniosArbol.size()];

        if(listaAnios.length > 0) {
            for (int i = 0; i < vectorAniosArbol.size(); i++) {
                listaAnios[i] = String.valueOf(vectorAniosArbol.get(i));
            }

            periodoDesde.setModel(new javax.swing.DefaultComboBoxModel(listaAnios));
            periodoDesde.setSelectedIndex(periodoDesde.getItemCount() - 1);
            periodoHasta.setModel(new javax.swing.DefaultComboBoxModel(listaAnios));
            periodoHasta.setSelectedIndex(0);
        } else {
            periodoDesde.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""}));
            periodoHasta.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""}));
        }
    }
    
    /**
     * Carga el arbol con los objetos pertinentes.
     *
     */
    private void construirArbol() {
        //Construccion del árbol
        raiz = new DefaultMutableTreeNode("Eventos");
        modelo = new DefaultTreeModel(raiz);
        arbol = new JTree(modelo);
        arbol.getSelectionModel().setSelectionMode(
                TreeSelectionModel.SINGLE_TREE_SELECTION);

        //Cambia los iconos
        DefaultTreeCellRenderer render = (DefaultTreeCellRenderer)
                arbol.getCellRenderer();
        //Icono nodos sin hijos
        render.setLeafIcon(null);
        //Icono nodos abiertos
        render.setOpenIcon(null);
        //Icono nodos abiertos cerrados
        render.setClosedIcon(null);

        if (vectorObjetosArbol == null) {
            //Carga los objetos que constituyen el árbol
            cargarVectorObjetosArbol();
            //Carga los combobox
            cargarComboBoxPeriodos();
        }

        //Carga el árbol
        cargarArbol();

        //Visualiza el arbol en el panel
        panelArbol.add(new JScrollPane(arbol));
        panelArbol.repaint();
        panelArbol.revalidate();
    }

    /**
     * Carga el vector con todos los objetos que se deberán listar en el árbol.
     */
    private void cargarVectorObjetosArbol() {
        //idPaciente
        int idPaciente = 
                GestionPacientePresentacion.getPaciente().getIdPaciente();

        //EnfermedadYDiagnosticoAmbulatorio
        Vector<EnfermedadYDiagnosticoAmbulatorio> vectorEnfermedadYDiagnosticoAmbulatorio =
                EnfermedadYDiagnosticoAmbulatorioLogica.
                getVectorEnfermedadYDiagnosticoAmbulatorioPorIdPaciente(
                idPaciente);

        //DiagnosticoYTriageInternacion
        Vector<DiagnosticoYTriageInternacion> vectorDiagnosticoYTriageInternacion =
                DiagnosticoYTriageInternacionLogica.
                getVectorDiagnosticoYTriageInternacionPorIdPaciente(
                idPaciente);

        //EvolucionAmbulatorio
        Vector vectorEvolucionAmbulatorio =
                EvolucionLogica.
                getVectorEvolucionAmbulatorioPorIdPaciente(idPaciente);

        //EvolucionInternacion
        Vector vectorEvolucionInternacion =
                EvolucionLogica.
                getVectorEvolucionInternacionPorIdPaciente(idPaciente);

        //Interconsulta
        Vector vectorInterconsulta =
                InterconsultaLogica.getVectorInterconsultaPorIdPaciente(idPaciente);

        //ExamenComplementario
        Vector vectorExamenComplementario =
                ExamenComplementarioLogica.
                getVectorExamenComplementarioPorIdPaciente(idPaciente);

        //AplicacionVacuna
        Vector vectorAplicacionVacuna =
                AplicacionVacunaLogica.
                getVectorAplicacionVacunaPorIdPaciente(idPaciente);

        //TratamientoYPractica
        Vector vectorTratamientoYPractica =
                TratamientoYPracticaLogica.
                getVectorTratamientoYPracticaPorIdPaciente(idPaciente);

        //TratamientoFarmacologico
        Vector vectorTratamientoFarmacologico =
                FarmacologicoLogica.
                getVectorFarmacologicoPorIdPaciente(idPaciente);

        //TratamientoNoFarmacologico
        Vector vectorTratamientoNoFarmacologico =
                NoFarmacologicoLogica.
                getVectorNoFarmacologicoPorIdPaciente(idPaciente);

        //EvolucionEnfermeriaDeInternacion
        Vector vectorEvolucionEnfermeriaDeInternacion =
                EvolucionEnfermeriaDeInternacionLogica.
                getVectorEvolucionEnfermeriaDeInternacionPorIdPaciente(idPaciente);

        vectorObjetosArbol = CapaLogica.unirVectores(
                vectorEvolucionEnfermeriaDeInternacion,
                CapaLogica.unirVectores(
                    vectorTratamientoNoFarmacologico,
                    CapaLogica.unirVectores(
                        vectorTratamientoFarmacologico,
                        CapaLogica.unirVectores(
                            vectorTratamientoYPractica,
                            CapaLogica.unirVectores(
                                vectorAplicacionVacuna,
                                CapaLogica.unirVectores(
                                    vectorExamenComplementario,
                                    CapaLogica.unirVectores(
                                        vectorInterconsulta,
                                        CapaLogica.unirVectores(
                                            vectorEvolucionInternacion,
                                            CapaLogica.unirVectores(
                                                vectorEvolucionAmbulatorio,
                                                CapaLogica.unirVectores(
                                                    vectorEnfermedadYDiagnosticoAmbulatorio,
                                                    vectorDiagnosticoYTriageInternacion))))))))));

        //Ordenar vector por fecha descendente
        if (vectorObjetosArbol != null) {
            bubbleSort(vectorObjetosArbol);
            //Carga los años
            cargarVectorAnios();
        }
        
    }

    /**
     * Carga los objetos recuperados en el árbol.
     *
     */
    private void cargarArbol() {
        //Definición de variables
        DefaultMutableTreeNode padre;
        DefaultMutableTreeNode hijo;
        int anio = -1;
        int posicionHijo = 0;
        int posicionPadre = 0;

        if (vectorObjetosArbol != null) {
            //Primer padre
            anio = Integer.valueOf(periodoHasta.getSelectedItem().toString());
            padre = new DefaultMutableTreeNode(anio);
            modelo.insertNodeInto(padre, raiz, posicionPadre);

            //Recorre el vector cargando dinámicamente los objetos según correspondan
            for (int i = 0; i < vectorObjetosArbol.size(); i++) {
                if (anioEntre(getFechaObjeto(
                        vectorObjetosArbol.get(i)).getYear() + 1900)) {
                    //Si el año no coincide
                    if ((getFechaObjeto(vectorObjetosArbol.get(i)).getYear() + 1900)
                            != anio) {
                        //Se crea un nuevo padre con el año
                        anio  = getFechaObjeto(
                                vectorObjetosArbol.get(i)).getYear() + 1900;
                        padre = new DefaultMutableTreeNode(anio);
                        posicionPadre++;
                        modelo.insertNodeInto(padre, raiz, posicionPadre);
                        posicionHijo = 0;
                    }

                    //Se carga el hijo
                    hijo = getObjetoHijo(vectorObjetosArbol.get(i));
                    modelo.insertNodeInto(hijo, padre, posicionHijo);
                    posicionHijo++;
                }
            }
        }

        //Expande todo el árbol
        for (int i = 0; i < arbol.getRowCount(); i++) {
            arbol.expandRow(i);
        }

        //Carga el panel visualizador con el evento seleccionado
        arbol.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent evt) {
                //Returns the last path element of the selection.
                //This method is useful only when the selection model allows a single selection.
                DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                        arbol.getLastSelectedPathComponent();

                //Nothing is selected
                if (node == null) {
                    return;
                }

                Object nodeInfo = node.getUserObject();
                if (node.isLeaf()) {
                    visualizador.setText(getObjetoHTML(nodeInfo));
                    visualizador.setCaretPosition(0);

                } else {
                    visualizador.setText("");
                }
            }
        });
    }

    /**
     * Dado el objeto, lo devuelve casteado en forma de DefaultMutableTreeNode.
     *
     * @param objeto El objeto a agregar
     * @return El objeto en modo DefaultMutableTreeNode
     */
    private DefaultMutableTreeNode getObjetoHijo(Object objeto) {
        if (objeto instanceof DiagnosticoYTriageInternacion) {
            return new DefaultMutableTreeNode(
                    (DiagnosticoYTriageInternacion) objeto);
            
        } else if (objeto instanceof EnfermedadYDiagnosticoAmbulatorio) {
           return new DefaultMutableTreeNode(
                   (EnfermedadYDiagnosticoAmbulatorio) objeto);

        } else if (objeto instanceof Evolucion) {
           return new DefaultMutableTreeNode(
                   (Evolucion) objeto);

        } else if (objeto instanceof Interconsulta) {
           return new DefaultMutableTreeNode(
                   (Interconsulta) objeto);

        } else if (objeto instanceof ExamenComplementario) {
           return new DefaultMutableTreeNode(
                   (ExamenComplementario) objeto);

        } else if (objeto instanceof AplicacionVacuna) {
           return new DefaultMutableTreeNode(
                   (AplicacionVacuna) objeto);

        } else if (objeto instanceof TratamientoYPractica) {
           return new DefaultMutableTreeNode(
                   (TratamientoYPractica) objeto);

        } else if (objeto instanceof Farmacologico) {
           return new DefaultMutableTreeNode(
                   (Farmacologico) objeto);

        } else if (objeto instanceof NoFarmacologico) {
           return new DefaultMutableTreeNode(
                   (NoFarmacologico) objeto);

        } else if (objeto instanceof EvolucionEnfermeriaDeInternacion) {
           return new DefaultMutableTreeNode(
                   (EvolucionEnfermeriaDeInternacion) objeto);

        } else {
           return null;
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        textoDescriptivoVentana = new javax.swing.JLabel();
        textoPeriodoDesde = new javax.swing.JLabel();
        periodoDesde = new javax.swing.JComboBox();
        textoPeriodoHasta = new javax.swing.JLabel();
        periodoHasta = new javax.swing.JComboBox();
        splitPanel = new javax.swing.JSplitPane();
        scrollPanelArbol = new javax.swing.JScrollPane();
        panelArbol = new javax.swing.JPanel();
        scrollPanelVisualizador = new javax.swing.JScrollPane();
        visualizador = new javax.swing.JEditorPane();
        botonVerPeriodoSeleccionado = new javax.swing.JButton();
        botonVerTodo = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Eventos");

        textoDescriptivoVentana.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoVentana.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVentana.setText("Cronología de eventos del paciente.");
        textoDescriptivoVentana.setPreferredSize(new java.awt.Dimension(1004, 20));

        textoPeriodoDesde.setFont(Fuente.FUENTE_LABEL);
        textoPeriodoDesde.setForeground(Fuente.COLOR_NORMAL);
        textoPeriodoDesde.setText("Período desde");
        textoPeriodoDesde.setPreferredSize(new java.awt.Dimension(68, 20));

        periodoDesde.setFont(Fuente.FUENTE_COMBOBOX);
        periodoDesde.setForeground(Fuente.COLOR_NORMAL);
        periodoDesde.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""}));
        periodoDesde.setPreferredSize(new java.awt.Dimension(70, 20));

        textoPeriodoHasta.setFont(Fuente.FUENTE_LABEL);
        textoPeriodoHasta.setForeground(Fuente.COLOR_NORMAL);
        textoPeriodoHasta.setText("hasta");
        textoPeriodoHasta.setPreferredSize(new java.awt.Dimension(27, 20));

        periodoHasta.setFont(Fuente.FUENTE_COMBOBOX);
        periodoHasta.setForeground(Fuente.COLOR_NORMAL);
        periodoHasta.setModel(new javax.swing.DefaultComboBoxModel(new String[] {""}));
        periodoHasta.setPreferredSize(new java.awt.Dimension(70, 20));

        splitPanel.setBorder(null);
        splitPanel.setDividerLocation(300);
        splitPanel.setDividerSize(8);
        splitPanel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        splitPanel.setMinimumSize(new java.awt.Dimension(0, 0));
        splitPanel.setOneTouchExpandable(true);
        splitPanel.setPreferredSize(new java.awt.Dimension(1002, 666));

        scrollPanelArbol.setMinimumSize(new java.awt.Dimension(0, 0));
        scrollPanelArbol.setPreferredSize(new java.awt.Dimension(300, 0));

        panelArbol.setLayout(new javax.swing.BoxLayout(panelArbol, javax.swing.BoxLayout.LINE_AXIS));
        scrollPanelArbol.setViewportView(panelArbol);

        splitPanel.setLeftComponent(scrollPanelArbol);

        scrollPanelVisualizador.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPanelVisualizador.setAutoscrolls(true);
        scrollPanelVisualizador.setMinimumSize(new java.awt.Dimension(0, 0));
        scrollPanelVisualizador.setPreferredSize(new java.awt.Dimension(497, 251));

        visualizador.setContentType("text/html");
        visualizador.setEditable(false);
        visualizador.setFont(Fuente.FUENTE_TEXTFIELD);
        visualizador.setForeground(Fuente.COLOR_NORMAL);
        visualizador.setText("<html>    <head>      </head>    <body>      <p style=\"margin-top: 0\">              </p>    </body>  </html>  ");
        visualizador.setFocusable(false);
        visualizador.setMinimumSize(new java.awt.Dimension(0, 0));
        visualizador.setPreferredSize(new java.awt.Dimension(497, 220));
        scrollPanelVisualizador.setViewportView(visualizador);

        splitPanel.setRightComponent(scrollPanelVisualizador);

        botonVerPeriodoSeleccionado.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonVerPeriodoSeleccionado.setForeground(Fuente.COLOR_NORMAL);
        botonVerPeriodoSeleccionado.setIcon(Icono.ICONO_16_ACEPTAR);
        botonVerPeriodoSeleccionado.setText("Ver período");
        botonVerPeriodoSeleccionado.setToolTipText("Personaliza el árbol según las características ingresadas");
        botonVerPeriodoSeleccionado.setPreferredSize(new java.awt.Dimension(175, 23));
        botonVerPeriodoSeleccionado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonVerPeriodoSeleccionadoActionPerformed(evt);
            }
        });

        botonVerTodo.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonVerTodo.setForeground(Fuente.COLOR_NORMAL);
        botonVerTodo.setIcon(Icono.ICONO_16_ACEPTAR);
        botonVerTodo.setText("Ver todo");
        botonVerTodo.setToolTipText("Visualiza todos los peíodos");
        botonVerTodo.setPreferredSize(new java.awt.Dimension(175, 23));
        botonVerTodo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonVerTodoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(textoPeriodoDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(periodoDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textoPeriodoHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(periodoHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 369, Short.MAX_VALUE)
                .addComponent(botonVerPeriodoSeleccionado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonVerTodo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.DEFAULT_SIZE, 1004, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(splitPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGap(11, 11, 11))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textoPeriodoDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(periodoDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoPeriodoHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(periodoHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonVerTodo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonVerPeriodoSeleccionado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(splitPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 610, Short.MAX_VALUE)
                .addGap(14, 14, 14))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonVerPeriodoSeleccionadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonVerPeriodoSeleccionadoActionPerformed
        if (!periodoDesde.getSelectedItem().toString().isEmpty() &&
                !periodoHasta.getSelectedItem().toString().isEmpty()) {
            if (validarCampos()) {
                customizado = true;
                //Borra el arbol
                panelArbol.remove(0);
                visualizador.setText("");

                construirArbol();
            } else {
                MensajePresentacion.errorDatoInvalido();
            }
        }
    }//GEN-LAST:event_botonVerPeriodoSeleccionadoActionPerformed

    private void botonVerTodoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonVerTodoActionPerformed
        periodoDesde.setSelectedIndex(periodoDesde.getItemCount() - 1);
        periodoHasta.setSelectedIndex(0);
        if (!periodoDesde.getSelectedItem().toString().isEmpty() &&
                !periodoHasta.getSelectedItem().toString().isEmpty()) {
            customizado = false;
            //Borra el arbol
            panelArbol.remove(0);
            visualizador.setText("");

            construirArbol();
        }
    }//GEN-LAST:event_botonVerTodoActionPerformed

    /**
     * Valida los datos ingresados.
     * 
     * @return true si son correctos, false en caso contrario
     */
    private boolean validarCampos() {
        if (Integer.valueOf(periodoDesde.getSelectedItem().toString()) <=
                Integer.valueOf(periodoHasta.getSelectedItem().toString())) {
            textoPeriodoDesde.setForeground(Fuente.COLOR_NORMAL);
            textoPeriodoDesde.setToolTipText(null);
            textoPeriodoHasta.setForeground(Fuente.COLOR_NORMAL);
            textoPeriodoHasta.setToolTipText(null);
            return true;
        } else {
            textoPeriodoDesde.setForeground(
                    Fuente.COLOR_ERROR);
            textoPeriodoDesde.setToolTipText(
                    InformeError.INFORME_ERROR_EVENTO_PERIODO);
            textoPeriodoHasta.setForeground(
                    Fuente.COLOR_ERROR);
            textoPeriodoHasta.setToolTipText(
                    InformeError.INFORME_ERROR_EVENTO_PERIODO);
            return false;
        }
    }

    /**
     * Ordena mediante el método burbuja
     * @param vector
     */
    public void bubbleSort(Vector vector) {
        int n = vector.size();
        Integer anio = getFechaObjeto(vector.get(0)).getYear() + 1900;

        for (int pass = 1; pass < n; pass++) {  // count how many times
            //Mientra se ordena se completa la lista de años
            anio = getFechaObjeto(vector.get(pass)).getYear() + 1900;

            // This next loop becomes shorter and shorter

            for (int i = 0; i < (n - pass); i++) {
                if (getFechaObjeto(vector.get(i)).before(
                        getFechaObjeto(vector.get(i + 1)))) {
                    Object temp = vector.get(i);
                    vector.setElementAt(vector.get(i + 1), i);
                    vector.setElementAt(temp, (i + 1));
                }
            }
        }
    }

    /**
     * Carga, ordena y elimina años duplicados.
     * 
     */
    private void cargarVectorAnios() {
        if (vectorObjetosArbol != null) {
            for (int i = 0; i < vectorObjetosArbol.size(); i++) {
                if (!vectorAniosArbol.contains(
                        getFechaObjeto(vectorObjetosArbol.get(i)).getYear() + 1900)) {
                    vectorAniosArbol.add(
                            getFechaObjeto(vectorObjetosArbol.get(i)).getYear() + 1900);
                }
            }
        }
    }

    /**
     * Dado el objeto retorna su descripcion en formato HTML.
     *
     * @param objeto El objeto a visualizar
     * @return El string con la correspondiente descripción
     */
    private String getObjetoHTML(Object objeto) {
        if (objeto instanceof DiagnosticoYTriageInternacion) {
            return DiagnosticoYTriageInternacionLogica.
                    getDiagnosticoYTriageInternacionHTML(
                    (DiagnosticoYTriageInternacion) objeto);

        } else if (objeto instanceof EnfermedadYDiagnosticoAmbulatorio) {
           return EnfermedadYDiagnosticoAmbulatorioLogica.
                    getEnfermedadYDiagnosticoAmbulatorioHTML(
                    (EnfermedadYDiagnosticoAmbulatorio) objeto);

        } else if (objeto instanceof Evolucion) {
           return EvolucionLogica.
                    getEvolucionHTML(
                    (Evolucion) objeto);

        } else if (objeto instanceof Interconsulta) {
           return InterconsultaLogica.
                    getInterconsultaHTML(
                    (Interconsulta) objeto);

        } else if (objeto instanceof ExamenComplementario) {
           return ExamenComplementarioLogica.
                    getExamenComplementarioHTML(
                    (ExamenComplementario) objeto);

        } else if (objeto instanceof AplicacionVacuna) {
           return AplicacionVacunaLogica.
                    getAplicacionVacunaHTML(
                    (AplicacionVacuna) objeto);

        } else if (objeto instanceof TratamientoYPractica) {
           return TratamientoYPracticaLogica.
                    getTratamientoYPracticaHTML(
                    (TratamientoYPractica) objeto);

        } else if (objeto instanceof Farmacologico) {
           return FarmacologicoLogica.
                    getFarmacologicoHTML(
                    (Farmacologico) objeto);

        } else if (objeto instanceof NoFarmacologico) {
           return NoFarmacologicoLogica.
                    getNoFarmacologicoHTML(
                    (NoFarmacologico) objeto);

        } else if (objeto instanceof EvolucionEnfermeriaDeInternacion) {
           return EvolucionEnfermeriaDeInternacionLogica.
                    getEvolucionEnfermeriaDeInternacionHTML(
                    (EvolucionEnfermeriaDeInternacion) objeto);

        } else {
           return null;
        }
    }

    /**
     * Retorna la fecha del objeto.
     *
     * @param objeto El objeto
     * @return La fecha
     */
    private Date getFechaObjeto(Object objeto) {
        if (objeto instanceof DiagnosticoYTriageInternacion) {
            return ((DiagnosticoYTriageInternacion) objeto).
                    getFechaDiagnosticoYTriageInternacion();

        } else if (objeto instanceof EnfermedadYDiagnosticoAmbulatorio) {
            return ((EnfermedadYDiagnosticoAmbulatorio) objeto).
                    getFechaEnfermedadYDiagnosticoAmbulatorio();

        } else if (objeto instanceof Evolucion) {
           return ((Evolucion) objeto).
                    getFechaEvolucion();

        } else if (objeto instanceof Interconsulta) {
           return ((Interconsulta) objeto).
                    getFechaInterconsulta();

        } else if (objeto instanceof ExamenComplementario) {
           return ((ExamenComplementario) objeto).
                    getFechaExamenComplementario();

        } else if (objeto instanceof AplicacionVacuna) {
           return ((AplicacionVacuna) objeto).
                    getFechaPeriodoAplicacionVacuna();

        } else if (objeto instanceof TratamientoYPractica) {
           return ((TratamientoYPractica) objeto).
                    getFechaTratamientoYPractica();

        } else if (objeto instanceof Farmacologico) {
           return ((Farmacologico) objeto).
                    getFechaFarmacologico();

        } else if (objeto instanceof NoFarmacologico) {
           return ((NoFarmacologico) objeto).
                    getFechaNoFarmacologico();

        } else if (objeto instanceof EvolucionEnfermeriaDeInternacion) {
           return ((EvolucionEnfermeriaDeInternacion) objeto).
                    getFechaEvolucionEnfermeriaDeInternacion();

        } else {
           return null;
        }
    }

    /**
     * Imprime el area de visualización
     */
    public void imprimir() {
        RestriccionAcceso.Imprimir(null, true, visualizador,
                GestionPacientePresentacion.getPaciente());
    }

    /**
     * Verficia si el año del objeto esta entre los años seleccionados.
     *
     * @param anioObjeto El año del objeto
     * @return true si pertenece al período seleccionado, false en caso contario
     */
    private boolean anioEntre(int anioObjeto) {
        //Si esta en modo customización
        if (customizado) {
            //Si esta entre los años seleccionados
            if (anioObjeto >= Integer.valueOf(periodoDesde.getSelectedItem().toString()) &&
                    anioObjeto <= Integer.valueOf(periodoHasta.getSelectedItem().toString())) {
                return true;
            } else {
                return false;
            }
        } else {
            return true;
        }
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    dispose();
                }
            }
        };

        //Setear eventos
        panelArbol.addKeyListener(keyListenerEscape);
        botonVerPeriodoSeleccionado.addKeyListener(keyListenerEscape);
        botonVerTodo.addKeyListener(keyListenerEscape);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonVerPeriodoSeleccionado;
    private javax.swing.JButton botonVerTodo;
    private javax.swing.JPanel panelArbol;
    private javax.swing.JComboBox periodoDesde;
    private javax.swing.JComboBox periodoHasta;
    private javax.swing.JScrollPane scrollPanelArbol;
    private javax.swing.JScrollPane scrollPanelVisualizador;
    private javax.swing.JSplitPane splitPanel;
    private javax.swing.JLabel textoDescriptivoVentana;
    private javax.swing.JLabel textoPeriodoDesde;
    private javax.swing.JLabel textoPeriodoHasta;
    private javax.swing.JEditorPane visualizador;
    // End of variables declaration//GEN-END:variables
    private Vector vectorObjetosArbol;
    private Vector<Integer> vectorAniosArbol;
    private JTree arbol;
    private DefaultMutableTreeNode raiz;
    private DefaultTreeModel modelo;
    private boolean customizado;
}
